home *** CD-ROM | disk | FTP | other *** search
/ PC-X 1997 October / pcx14_9710.iso / swag / sorting.swg / 0054_8 Different Sorting Methods.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1995-05-26  |  10.5 KB  |  438 lines

  1.  
  2. { Updated SORTING.SWG on May 26, 1995 }
  3.  
  4. {
  5. >I've been programming for a couple years now, but there are certain things
  6. >that you seldom just figure out on your own.  One of them is the multitude
  7. >of standard sorting techniques.  I did learn these, however, in a class I
  8. >took last year in Turbo Pascal.  Let's see, Bubble Sort, Selection Sort,
  9. >Quick Sort..  I think that's what they were called.  Anyway, if anyone
  10. >has the time and desire I'd appreciate a quick run-down of each and if
  11. >possible some source for using them on a linked list.  I remember most of
  12. >the code to do them on arrays, but I forget which are the most efficient
  13. >for each type of data.
  14.  
  15. Here is a program that I was given to demonstrate 8 different types of sorts.
  16. I don't claim to know how they work, but it does shed some light on what the
  17. best type probably is.  BTW, it can be modified to allow for a random number
  18. of sort elements (up to maxint div 10 I believe).
  19.  
  20.    ALLSORT.PAS: Demonstration of various sorting methods.
  21.                 Released to the public domain by Wayel A. Al-Wohaibi.
  22.  
  23.    ALLSORT.PAS was written in Turbo Pascal 3.0 (but compatible with
  24.    TP6.0) while taking a pascal course in 1988. It is provided as is,
  25.    to demonstrate how sorting algorithms work. Sorry, no documentation
  26.    (didn't imagine it would be worth releasing) but bugs are included
  27.    too!
  28.  
  29.    ALLSORT simply shows you how elements are rearranged in each
  30.    iteration of each of the eight popular sorting methods.
  31. }
  32.  
  33. program SORTINGMETHODS;
  34. uses
  35.   Crt;
  36.  
  37. const
  38.   N = 14;                              (* NO. OF DATA TO BE SORTED *)
  39.   Digits = 3;                          (* DIGITAL SIZE OF THE DATA *)
  40.   Range = 1000;                        (* RANGE FOR THE RANDOM GENERATOR *)
  41.  
  42. type
  43.   ArrayType = array[1..N] of integer;
  44.   TwoDimension = array[0..9, 1..N] of integer; (* FOR RADIX SORT ONLY *)
  45.  
  46. var
  47.   Data : ArrayType;
  48.   D : integer;
  49.  
  50.   (*--------------------------------------------------------------------*)
  51.  
  52.   procedure GetSortMethod;
  53.   begin
  54.     clrscr;
  55.     writeln;
  56.     writeln('                          CHOOSE:          ');
  57.     writeln('                                           ');
  58.     writeln('                      1 FOR SELECT SORT    ');
  59.     writeln('                      2 FOR INSERT SORT    ');
  60.     writeln('                      3 FOR BUBBLE SORT    ');
  61.     writeln('                      4 FOR SHAKE  SORT    ');
  62.     writeln('                      5 FOR HEAP   SORT    ');
  63.     writeln('                      6 FOR QUICK  SORT    ');
  64.     writeln('                      7 FOR SHELL  SORT    ');
  65.     writeln('                      8 FOR RADIX  SORT    ');
  66.     writeln('                      9 TO EXIT ALLSORT    ');
  67.     writeln('                                           ');
  68.     writeln;
  69.     readln(D)
  70.   end;
  71.  
  72.   procedure LoadList;
  73.   var
  74.     I : integer;
  75.   begin
  76.     for I := 1 to N do
  77.       Data[I] := random(Range)
  78.   end;
  79.  
  80.   procedure ShowInput;
  81.   var
  82.     I : integer;
  83.   begin
  84.     clrscr;
  85.     write('INPUT :');
  86.     for I := 1 to N do
  87.       write(Data[I]:5);
  88.     writeln
  89.   end;
  90.  
  91.   procedure ShowOutput;
  92.   var
  93.     I : integer;
  94.   begin
  95.     write('OUTPUT:');
  96.     for I := 1 to N do
  97.       write(Data[I]:5)
  98.   end;
  99.  
  100.   procedure Swap(var X, Y : integer);
  101.   var
  102.     Temp : integer;
  103.   begin
  104.     Temp := X;
  105.     X := Y;
  106.     Y := Temp
  107.   end;
  108.  
  109.   (*-------------------------- R A D I X   S O R T ---------------------*)
  110.  
  111.   function Hash(Number, H : integer) : integer;
  112.   begin
  113.     case H of
  114.       3 : Hash := Number mod 10;
  115.       2 : Hash := (Number mod 100) div 10;
  116.       1 : Hash := Number div 100
  117.     end
  118.   end;
  119.  
  120.   procedure CleanArray(var TwoD : TwoDimension);
  121.   var
  122.     I, J : integer;
  123.   begin
  124.     for I := 0 to 9 do
  125.       for J := 1 to N do
  126.         TwoD[I, J] := 0
  127.   end;
  128.  
  129.   procedure PlaceIt(var X : TwoDimension; Number, I : integer);
  130.   var
  131.     J : integer;
  132.     Empty : boolean;
  133.   begin
  134.     J := 1;
  135.     Empty := false;
  136.     repeat
  137.       if (X[I, J] > 0) then
  138.         J := J + 1
  139.       else
  140.         Empty := true;
  141.     until (Empty) or (J = N);
  142.     X[I, J] := Number
  143.   end;
  144.  
  145.   procedure UnLoadIt(X : TwoDimension; var Passed : ArrayType);
  146.   var
  147.     I,
  148.     J,
  149.     K : integer;
  150.   begin
  151.     K := 1;
  152.     for I := 0 to 9 do
  153.       for J := 1 to N do
  154.         begin
  155.           if (X[I, J] > 0) then
  156.             begin
  157.               Passed[K] := X[I, J];
  158.               K := K + 1
  159.             end
  160.         end
  161.   end;
  162.  
  163.   procedure RadixSort(var Pass : ArrayType; N : integer);
  164.   var
  165.     Temp : TwoDimension;
  166.     Element,
  167.     Key,
  168.     Digit,
  169.     I : integer;
  170.   begin
  171.     for Digit := Digits downto 1 do
  172.       begin
  173.         CleanArray(Temp);
  174.         for I := 1 to N do
  175.           begin
  176.             Element := Pass[I];
  177.             Key := Hash(Element, Digit);
  178.             PlaceIt(Temp, Element, Key)
  179.           end;
  180.         UnLoadIt(Temp, Pass);
  181.         ShowOutput;
  182.         readln
  183.       end
  184.   end;
  185.  
  186.   (*-------------------------- H E A P   S O R T -----------------------*)
  187.  
  188.   procedure ReHeapDown(var HEAPData : ArrayType; Root, Bottom : integer);
  189.   var
  190.     HeapOk : boolean;
  191.     MaxChild : integer;
  192.   begin
  193.     HeapOk := false;
  194.     while (Root * 2 <= Bottom)
  195.     and not HeapOk do
  196.       begin
  197.         if (Root * 2 = Bottom) then
  198.           MaxChild := Root * 2
  199.         else
  200.           if (HEAPData[Root * 2] > HEAPData[Root * 2 + 1]) then
  201.             MaxChild := Root * 2
  202.           else
  203.             MaxChild := Root * 2 + 1;
  204.         if (HEAPData[Root] < HEAPData[MaxChild]) then
  205.           begin
  206.             Swap(HEAPData[Root], HEAPData[MaxChild]);
  207.             Root := MaxChild
  208.           end
  209.         else
  210.           HeapOk := true
  211.       end
  212.   end;
  213.  
  214.   procedure HeapSort(var Data : ArrayType; NUMElementS : integer);
  215.   var
  216.     NodeIndex : integer;
  217.   begin
  218.     for NodeIndex := (NUMElementS div 2) downto 1 do
  219.       ReHeapDown(Data, NodeIndex, NUMElementS);
  220.     for NodeIndex := NUMElementS downto 2 do
  221.       begin
  222.         Swap(Data[1], Data[NodeIndex]);
  223.         ReHeapDown(Data, 1, NodeIndex - 1);
  224.         ShowOutput;
  225.         readln;
  226.       end
  227.   end;
  228.  
  229.   (*-------------------------- I N S E R T   S O R T -------------------*)
  230.  
  231.   procedure StrInsert(var X : ArrayType; N : integer);
  232.   var
  233.     J,
  234.     K,
  235.     Y : integer;
  236.     Found : boolean;
  237.   begin
  238.     for J := 2 to N do
  239.       begin
  240.         Y := X[J];
  241.         K := J - 1;
  242.         Found := false;
  243.         while (K >= 1)
  244.         and (not Found) do
  245.           if (Y < X[K]) then
  246.             begin
  247.               X[K + 1] := X[K];
  248.               K := K - 1
  249.             end
  250.           else
  251.             Found := true;
  252.         X[K + 1] := Y;
  253.         ShowOutput;
  254.         readln
  255.       end
  256.    end;
  257.  
  258.   (*-------------------------- S H E L L   S O R T ---------------------*)
  259.  
  260.   procedure ShellSort(var A : ArrayType; N : integer);
  261.   var
  262.     Done : boolean;
  263.     Jump,
  264.     I,
  265.     J : integer;
  266.   begin
  267.     Jump := N;
  268.     while (Jump > 1) do
  269.       begin
  270.         Jump := Jump div 2;
  271.         repeat
  272.           Done := true;
  273.           for J := 1 to (N - Jump) do
  274.             begin
  275.               I := J + Jump;
  276.               if (A[J] > A[I]) then
  277.                 begin
  278.                   Swap(A[J], A[I]);
  279.                   Done := false
  280.                 end;
  281.             end;
  282.         until Done;
  283.         ShowOutput;
  284.         readln
  285.       end
  286.   end;
  287.  
  288.   (*-------------------------- B U B B L E   S O R T -------------------*)
  289.  
  290.   procedure BubbleSort(var X : ArrayType; N : integer);
  291.   var
  292.     I,
  293.     J : integer;
  294.   begin
  295.     for I := 2 to N do
  296.       begin
  297.         for J := N downto I do
  298.           if (X[J] < X[J - 1]) then
  299.             Swap(X[J - 1], X[J]);
  300.         ShowOutput;
  301.         readln
  302.       end
  303.   end;
  304.  
  305.   (*-------------------------- S H A K E   S O R T ---------------------*)
  306.  
  307.   procedure ShakeSort(var X : ArrayType; N : integer);
  308.   var
  309.     L,
  310.     R,
  311.     K,
  312.     J : integer;
  313.   begin
  314.     L := 2;
  315.     R := N;
  316.     K := N;
  317.     repeat
  318.       for J := R downto L do
  319.         if (X[J] < X[J - 1]) then
  320.           begin
  321.             Swap(X[J], X[J - 1]);
  322.             K := J
  323.           end;
  324.       L := K + 1;
  325.       for J := L to R do
  326.         if (X[J] < X[J - 1]) then
  327.           begin
  328.             Swap(X[J], X[J - 1]);
  329.             K := J
  330.           end;
  331.       R := K - 1;
  332.       ShowOutput;
  333.       readln;
  334.     until L >= R
  335.   end;
  336.  
  337.   (*-------------------------- Q W I C K   S O R T ---------------------*)
  338.  
  339.   procedure Partition(var A : ArrayType; First, Last : integer);
  340.   var
  341.     Right,
  342.     Left : integer;
  343.     V : integer;
  344.   begin
  345.     V := A[(First + Last) div 2];
  346.     Right := First;
  347.     Left := Last;
  348.     repeat
  349.       while (A[Right] < V) do
  350.         Right := Right + 1;
  351.       while (A[Left] > V) do
  352.         Left := Left - 1;
  353.       if (Right <= Left) then
  354.         begin
  355.           Swap(A[Right], A[Left]);
  356.           Right := Right + 1;
  357.           Left := Left - 1
  358.         end;
  359.     until Right > Left;
  360.     ShowOutput;
  361.     readln;
  362.     if (First < Left) then
  363.       Partition(A, First, Left);
  364.     if (Right < Last) then
  365.       Partition(A, Right, Last)
  366.   end;
  367.  
  368.   procedure QuickSort(var List : ArrayType; N : integer);
  369.   var
  370.     First,
  371.     Last : integer;
  372.   begin
  373.     First := 1;
  374.     Last := N;
  375.     if (First < Last) then
  376.       Partition(List, First, Last)
  377.   end;
  378.  
  379.   (*-------------------------- S E L E C T   S O R T -------------------*)
  380.  
  381.   procedure StrSelectSort(var X : ArrayType; N : integer);
  382.   var
  383.     I,
  384.     J,
  385.     K,
  386.     Y : integer;
  387.   begin
  388.     for I := 1 to N - 1 do
  389.       begin
  390.         K := I;
  391.         Y := X[I];
  392.         for J := (I + 1) to N do
  393.           if (X[J] < Y) then
  394.             begin
  395.               K := J;
  396.               Y := X[J]
  397.             end;
  398.         X[K] := X[J];
  399.         X[I] := Y;
  400.         ShowOutput;
  401.         readln
  402.       end
  403.   end;
  404.  
  405.   (*--------------------------------------------------------------------*)
  406.  
  407.   procedure Sort;
  408.   begin
  409.     case D of
  410.       1 : StrSelectSort(Data, N);
  411.       2 : StrInsert(Data, N);
  412.       3 : BubbleSort(Data, N);
  413.       4 : ShakeSort(Data, N);
  414.       5 : HeapSort(Data, N);
  415.       6 : QuickSort(Data, N);
  416.       7 : ShellSort(Data, N);
  417.       8 : RadixSort(Data, N);
  418.     else
  419.      writeln('BAD INPUT')
  420.     end
  421.   end;
  422.  
  423.   (*-------------------------------------------------------------------*)
  424.  
  425. BEGIN
  426.   GetSortMethod;
  427.   while (D <> 9) do
  428.     begin
  429.       LoadList;
  430.       ShowInput;
  431.       Sort;
  432.       writeln('PRESS ENTER TO RETURN');
  433.       readln;
  434.       GetSortMethod
  435.     end
  436. END.
  437.  
  438.